#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 010_Pandas_Data_Sorting_Aggregation.py
@time: 2025/2/17  11:37
# @describe: Pandas 数据排序与聚合
"""

"""
一、数据排序（Sorting）
    排序是指将数据按某个列的值进行升序或降序排列。Pandas 提供了两种主要的方法来进行排序：sort_values() 和 sort_index()。

    排序方法：
        sort_values()：根据列的值进行排序。
        sort_index()：根据行或列的索引进行排序。
"""
import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 按照 "Age" 列的值进行降序排序
df_sorted = df.sort_values(by="Age", ascending=False)
print(df_sorted)
print()


# 按照行索引进行排序
df_sorted_by_index = df.sort_index(axis=0)
print(df_sorted_by_index)
print()


"""
 二、数据聚合（Aggregation）
        聚合是将数据按某些规则进行汇总，通常是对某些列的数据进行求和、求平均数、求最大值、求最小值等操作。
        Pandas 提供了groupby()方法来对数据进行分组，然后应用不同的聚合函数。

        聚合方法:
                groupby()：按某些列分组。
                聚合函数：如 sum(), mean(), count(), min(), max(), std() 等。
 """
import pandas as pd


data = {'Department': ['HR', 'Finance', 'HR', 'IT', 'IT'],
        'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
        'Salary': [50000, 60000, 55000, 70000, 75000]}
df = pd.DataFrame(data)
print()

# 按照部门分组，并计算每个部门的平均薪资
grouped = df.groupby("Department")["Salary"].mean()
print(grouped)
print()


""" 多重聚合函数应用 """
# 按照部门分组，并计算每个部门的薪资的平均值 和 总和
grouped_multiple = df.groupby("Department").agg({"Salary": ["mean", "sum"]})
print(grouped_multiple)
print()



""" 分组后的排序  """
# 按照部门分组后，按薪资降序排序
# grouped_sorted = df.groupby("Department").apply(lambda x: x.sort_values(by="Salary", ascending=False))
# include_groups=False :  不包含分组列-Department
grouped_sorted = df.groupby("Department").apply(lambda x: x.sort_values(by="Salary", ascending=False), include_groups=False)
print(grouped_sorted)


""" 四、透视表:
  透视表（Pivot Table）是一个特殊的聚合方式，可以让我们通过行、列和聚合函数对数据进行快速汇总，类似于 Excel 中的透视表。

"""
# 使用 pivot_table 计算每个部门的薪资平均值
pivot_table = df.pivot_table(values="Salary", index="Department", aggfunc="mean")
print(pivot_table)